//go:build purego
// +build purego

package models

import (
	"context"
	"database/sql"
	"fmt"
	"log"
	"os"
	"path/filepath"

	// 使用纯Go实现的SQLite替代品
	_ "modernc.org/sqlite"
)

// DB 是全局数据库连接实例
var DB *sql.DB

// Device 代表设备认证信息的模型
type Device struct {
	DeviceID  string // 主键
	Y1        string // 大整数字符串表示
	Y2        string // 大整数字符串表示
	SessionID string // 会话ID，用于验证用户权限
}

// InitDB 初始化数据库连接和表结构
func InitDB(dbPath string) error {
	// 确保目录存在
	dir := filepath.Dir(dbPath)
	if _, err := os.Stat(dir); os.IsNotExist(err) {
		if err := os.MkdirAll(dir, 0755); err != nil {
			return fmt.Errorf("创建数据库目录失败: %v", err)
		}
	}

	// 使用纯Go实现的SQLite驱动
	db, err := sql.Open("sqlite", dbPath)
	if err != nil {
		return fmt.Errorf("打开数据库连接失败: %v", err)
	}

	// 测试连接
	if err := db.Ping(); err != nil {
		return fmt.Errorf("数据库连接测试失败: %v", err)
	}

	// 设置连接池参数
	db.SetMaxOpenConns(10)
	db.SetMaxIdleConns(5)

	// 创建设备表
	createTableSQL := `
	CREATE TABLE IF NOT EXISTS devices (
		device_id TEXT PRIMARY KEY,
		y1 TEXT NOT NULL,
		y2 TEXT NOT NULL,
		session_id TEXT
	);`

	_, err = db.Exec(createTableSQL)
	if err != nil {
		return fmt.Errorf("创建设备表失败: %v", err)
	}

	// 检查是否需要添加session_id列
	var count int
	err = db.QueryRow(`SELECT COUNT(*) FROM pragma_table_info('devices') WHERE name='session_id'`).Scan(&count)
	if err != nil {
		return fmt.Errorf("检查表结构失败: %v", err)
	}

	// 如果session_id列不存在，添加它
	if count == 0 {
		_, err = db.Exec(`ALTER TABLE devices ADD COLUMN session_id TEXT;`)
		if err != nil {
			return fmt.Errorf("添加session_id列失败: %v", err)
		}
		log.Println("成功添加session_id列到devices表")
	}

	// 保存全局连接
	DB = db
	log.Println("数据库初始化成功(Pure Go实现)")
	return nil
}

// SaveDevice 将设备信息保存到数据库
func SaveDevice(ctx context.Context, device *Device) error {
	if DB == nil {
		return fmt.Errorf("数据库未初始化")
	}

	// 使用预处理语句防止SQL注入
	stmt, err := DB.PrepareContext(ctx, `
		INSERT OR REPLACE INTO devices (device_id, y1, y2, session_id) 
		VALUES (?, ?, ?, ?)
	`)
	if err != nil {
		return err
	}
	defer stmt.Close()

	_, err = stmt.ExecContext(ctx, device.DeviceID, device.Y1, device.Y2, device.SessionID)
	return err
}

// GetDevice 根据deviceID获取设备信息
func GetDevice(ctx context.Context, deviceID string) (*Device, error) {
	if DB == nil {
		return nil, fmt.Errorf("数据库未初始化")
	}

	// 使用预处理语句防止SQL注入
	stmt, err := DB.PrepareContext(ctx, `
		SELECT device_id, y1, y2, session_id FROM devices WHERE device_id = ?
	`)
	if err != nil {
		return nil, err
	}
	defer stmt.Close()

	device := &Device{}
	// 使用sql.NullString来处理可能为NULL的session_id
	var sessionID sql.NullString
	err = stmt.QueryRowContext(ctx, deviceID).Scan(&device.DeviceID, &device.Y1, &device.Y2, &sessionID)
	if err != nil {
		if err == sql.ErrNoRows {
			return nil, nil // 未找到设备
		}
		return nil, err
	}

	// 如果sessionID有效，则赋值给device.SessionID，否则使用空字符串
	if sessionID.Valid {
		device.SessionID = sessionID.String
	} else {
		device.SessionID = ""
	}

	return device, nil
}

// CloseDB 关闭数据库连接
func CloseDB() {
	if DB != nil {
		DB.Close()
	}
}
